import axios from 'axios'
import store from '@/store'
import router from '@/router'
import {
  isCheckTimeOut
} from './auth'
import {
  Message
} from 'element-ui'
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})
const expiredTime = 3600 // 定义超时时间
// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在这个位置需要统一的去注入token
    const token = store.getters.token
    if (token) {
      // 判断token是否超过我们自己设定的超时时间
      if (isCheckTimeOut(expiredTime)) {
        store.dispatch('user/logout') // 退出操作
        // 跳转到登录页
        router.push('/login')
        // 返回Promise异常
        return Promise.reject(new Error('token超时了'))
      }

      // 如果token存在 注入token
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  // 人力资源接口，成功和失败都走response,所以区分业务的成功和失败只能通过response.data.success的true和false来判断
  // http状态码为200走response
  response => {
    const {
      success,
      message,
      data
    } = response.data
    // 成功的逻辑
    if (success) {
      return data
    }
    // 失败：在逻辑处理时，可以使用catch捕获这个异常对象
    Message.error(message)
    return Promise.reject(new Error(message))
  },
  // http状态码非200都走error
  error => {
    if (error.response && error.response.data && error.response.data.code === 10002) {
      // 当等于10002的时候 表示后端告诉我token超时或者失效了
      store.dispatch('user/logout') // 登出action 删除token
      // 记录当前访问路由
      const path = router.history.current.path
      // 方便登出再登录成功后能回到当时退出的路由地址，然后重新发起请求
      router.push('/login?redirect=' + encodeURI(path))
    }
    // 处理405没有权限
    /* if (error.response && error.response.data && error.response.data.code === 405) {
      console.log(405)
      Message.error('该接口处理测试中,尚未开通权限')
    } */
    return Promise.reject(error)
  }
)

export default service
